package com.android.yummycookies.model.commonModel;

import java.lang.ref.WeakReference;
import java.util.HashSet;
import java.util.Set;

import android.os.Handler;

/**
 * Classe permetant de gerer les pool d'observeurs
 * 
 * @author julien
 * 
 */
public class ObserversPool {

	/** Set contenant les handlers a notifier */
	private final Set<WeakReference<Handler>> handlers = new HashSet<WeakReference<Handler>>();

	public ObserversPool() {
	}

	/**
	 * Retourne l'ensemble des observeurs
	 * 
	 * @return un ensemble de handler
	 */
	public Set<WeakReference<Handler>> getObservers() {
		return handlers;
	}

	/**
	 * Ajoute un observeur
	 * 
	 * @param handler
	 *            le handler qui recevra les messages
	 * @return true si le handler a ete ajoute
	 */
	public boolean addObserver(Handler handler) {
		return handlers.add(new WeakReference<Handler>(handler));
	}

	/**
	 * Ajoute un ensemble d'observeurs
	 * 
	 * @param handlers
	 *            un enssemble d'observeur a ajouter
	 * @return true si les handler ont ete ajoutes
	 */
	public boolean addAllObservers(Set<WeakReference<Handler>> handlers) {
		return this.handlers.addAll(handlers);
	}

	/**
	 * Ajoute tous les observeurs d'un autre pool d'observeurs
	 * 
	 * @param observersPool
	 *            un pool d'observeurs
	 * @return true si les observeurs ont ete ajoutes
	 */
	public boolean addAllObservers(ObserversPool observersPool) {
		return handlers.addAll(observersPool.getObservers());
	}

	/**
	 * Supprime un observeur
	 * 
	 * @param handler
	 *            le handler a supprimer
	 * @return true si le handler a ete supprime
	 */
	public boolean removeObserver(Handler handler) {
		return this.handlers.remove(handler);
	}

	/**
	 * Supprime un ensemble d'observeurs
	 * 
	 * @param handlers
	 *            un esemble de handler a supprimer
	 * @return true les les handler ont ete supprimes
	 */
	public boolean removeAllObservers(Set<Handler> handlers) {
		return this.handlers.removeAll(handlers);
	}

	/**
	 * Supprime tous les observeurs d'un autre pool
	 * 
	 * @param obersObserversPool
	 *            un pool d'observeurs
	 * @return true si les observeurs ont ete supprimes
	 */
	public boolean removeAllObservers(ObserversPool obersObserversPool) {
		return handlers.removeAll(obersObserversPool.getObservers());
	}

	/**
	 * Supprime tous les observeurs
	 */
	public void clearObservers() {
		handlers.clear();
	}

}
